package singletonDesign;

/**
 * 最简单懒汉模式
 * 线程不安全
 */
public class SingletonLazyDesign {

	private  static    SingletonLazyDesign   singletonLazyDesign = null;


	private  SingletonLazyDesign(){

	}

	public  void  run(){

		System.out.println("跑跑跑");
	}


	public static SingletonLazyDesign  getSingletonLazyDesign (){
		if(singletonLazyDesign == null){

			singletonLazyDesign =   new SingletonLazyDesign();
		}
		return  singletonLazyDesign;
	}

	/**
	 * 加锁，但是几千万高比发，或者说方法里面代码业务复杂，加在方法上面就不合适
	 * 所以缩小范围，缩小锁的粒度
	 * @return
	 */
	public  static   synchronized    SingletonLazyDesign   getSafeSingletonLazyDesign (){
		if(singletonLazyDesign == null){

			singletonLazyDesign =   new SingletonLazyDesign();
		}
		return  singletonLazyDesign;
	}

	/**
	 *
	 * DCL ： 双重检查锁定Double Check Locking ,多线程情况下保持高性能
	 *
	 * 是否安全？  singletonLazyDesign =   new SingletonLazyDesign();  这句代码并不是原子性操作？ 为什么?
	 * 1 .  分配空间给对象
	 * 2 。 在空间内创建对象
	 * 3.   将对象赋值引用 singletonLazyDesign
	 *
	 * 1 -> 3 -> 2;那么主内存就还是空的，也就拿不到对象
	 * （指令重排，概率极低，但还是存在）
	 *
	 * 假如顺序错乱
	 * @return
	 */

	public  static   SingletonLazyDesign   getMoreSafeSingletonLazyDesign (){
		if(singletonLazyDesign == null){
			synchronized (SingletonLazyDesign.class){
				if(singletonLazyDesign == null){
					singletonLazyDesign =   new SingletonLazyDesign();

				}


			}
		}
		return  singletonLazyDesign;
	}
}
